/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.app.model;

import myftp.app.renderer.ExplorerFileTableRenderer;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import myftp.app.view.ServerTabPartView;
import myftp.app.view.dialog.TemplateDialog;
import myftp.core.view.listener.FileTreeListener;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 * Model abstrait pour les explorateur locaux/distants
 */
public abstract class ExplorerModel {

    /**
     * Arbre des dossiers
     * @var tree
     */
    public JTree tree = null;
    /**
     * Tableau des fichiers
     * @var fileTable
     */
    public JTable fileTable = null;
    /**
     * Référence au serveur
     * @var serveur
     */
    public ServerModel server = null;
    /**
     * Référence à l'onglet
     * @var tab
     */
    public ServerTabPartView tab = null;
    /**
     * Path du dossier courant
     * @var currentServerDir
     */
    public String currentServerDir = "";

    /**
     * Constructeur ExplorerModel
     * @param server
     * @param tab
     * @param path
     */
    public ExplorerModel(ServerModel server, ServerTabPartView tab, String path) {
        if (path == null) {
            /* En cas de problème critique dans la récupération du chemin,
            La poursuite du programme est impossible */

            /* Signalement du problème puis fin du programme */
            TemplateDialog.showInternalErrorDialog("Erreur Critique!");
            System.exit(0);
        }

        this.tab = tab;
        this.server = server;
        this.currentServerDir = path;

        /* Création de l'arbre d'exploration */
        this.tree = new JTree();
        this.tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        /* Pour un affichage de l'arbre plus agréable */
        DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
        renderer.setLeafIcon(renderer.getClosedIcon());
        this.tree.setCellRenderer(renderer);
        /* Pour permettre la réaction aux cliques */
        this.tree.addTreeSelectionListener(new FileTreeListener(this));


        /* Création de la table des fichiers */
        this.fileTable = new JTable();
        this.fileTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.fileTable.setDragEnabled(true);
        /* Pur un affichage plus agréable */
        this.fileTable.setDefaultRenderer(Object.class, new ExplorerFileTableRenderer());
        /* Réorganisation des colonnes impossible */
        fileTable.getTableHeader().setReorderingAllowed(false);

        /* Remplissage de l'arbre avec le chemin d'origine */
        ExplorerTreeModel rootNode = new ExplorerTreeModel(path);
        DefaultTreeModel mdlTree = new DefaultTreeModel(rootNode);
        chargement(rootNode);
        this.tree.setModel(mdlTree);
    }

    /**
     * Exploration du noeud sélectionné
     * @param noeud
     */
    public void chargement(ExplorerTreeModel noeud) {
        exploreNode(noeud);
        /* Rafraichissement de la table des fichiers */
        refreshFileTab(noeud);
    }

    /**
     * Création d'un arbre depuis un nouveau point d'origine path
     * @param path
     */
    public void rechargement(String path) {
        ExplorerTreeModel rootNode = new ExplorerTreeModel(path);
        DefaultTreeModel mdlTree = new DefaultTreeModel(rootNode);
        /* Exploration du premier noeud */
        exploreNode(rootNode);
        /* Rafraichissment de la table des fichiers */
        refreshFileTab(rootNode);
        this.tree.setModel(mdlTree);
    }

    /**
     * Création d'un noeud racine
     * @param root
     * @return
     */
    protected ExplorerTreeModel getSubDirs(ExplorerTreeModel root) {
        ExplorerTreeModel racine = new ExplorerTreeModel(root.getPathNode());

        /* Recuperation de la liste des sous-repertoires */
        ExplorerTreeModel[] reps = getReps(root);

        for (int i = 0; i
                < reps.length; i++) {
            ExplorerTreeModel rep = new ExplorerTreeModel(reps[i].getPathNode());
            racine.add(rep);
        }
        return racine;
    }

    protected abstract ExplorerTreeModel[] getReps(ExplorerTreeModel rep);

    protected abstract void exploreNode(ExplorerTreeModel noeud);

    protected abstract void refreshFileTab(ExplorerTreeModel node);

    public JTable getTable() {
        return this.fileTable;
    }

    public JTree getTree() {
        return this.tree;
    }

    public ExplorerTreeModel getTreeModel() {
        return (ExplorerTreeModel) this.tree.getModel();
    }

    public ServerTabPartView getTab() {
        return this.tab;
    }
}
